package com.dc.refactoring._3_重新组织数据._10_EncapsulateCollection.newObject;

import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import lombok.Data;

import java.util.Set;

/**
 * Description: Person 类
 * @author: gdc
 * @date: 2020/11/19
 * @version 1.0
 */
@Data
public class Person {

    /**
     * 课程集合
     */
    private Set<Course> courses = Sets.newHashSet();

    // 【2】修改设置函数（最简单的情况，它被用来初始化集合）
    //public void setCourses(Set<Course> courses) {
    //    // 此步保证设置函数，只能加载一次数据有效
    //    assert courses.isEmpty();
    //    this.courses.addAll(courses);
    //}

    // 【3】修改设置函数的名称，明确这个函数的意图
    public void initCourses(Set<Course> courses) {
        assert courses.isEmpty();
        this.courses.addAll(courses);
    }



    // 【4】修改取值函数，返回一个只读副本，用以确保没有任何一个用户能够通过取值函数修改集合
    // 这样就完成了对集合的封装。不通过Person提供的添加、移除函数，谁也不能修改集合内的元素
    public Set<Course> getCourses() {
        return ImmutableSet.copyOf(courses);
    }



    // 【1】建立修改函数, 添加、删除方法，用于修改集合的入口
    public void addCourse(Course course) {
        this.courses.add(course);
    }

    public void removeCourse(Course course) {
        courses.remove(course);
    }


    // 【5】此时可以围绕集合创建一些新的函数
    public int numberOfAdvancedCourses(){
        return (int) courses.stream().filter(Course::isAdvanced).count();
    }

    public int numberOfCourses(){
        return courses.size();
    }
}
